home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Software of the Month Club 2000 October
/
Software of the Month - Ultimate Collection Shareware 277.iso
/
pc
/
PROGRAMS
/
UTILITY
/
WINLINUX
/
DATA1.CAB
/
programs_-_include
/
ASM-ARM
/
ARCH-RPC
/
IRQ.H
< prev
next >
Wrap
C/C++ Source or Header
|
1999-09-17
|
4KB
|
175 lines
/*
* include/asm-arm/arch-rpc/irq.h
*
* Copyright (C) 1996 Russell King
*
* Changelog:
* 10-10-1996 RMK Brought up to date with arch-sa110eval
* 22-08-1998 RMK Restructured IRQ routines
*/
static void rpc_mask_irq_ack_a(unsigned int irq)
{
unsigned int temp;
__asm__ __volatile__(
"ldrb %0, [%2]\n"
" bic %0, %0, %1\n"
" strb %0, [%2]\n"
" strb %1, [%3]"
: "=&r" (temp)
: "r" (1 << (irq & 7)), "r" (ioaddr(IOMD_IRQMASKA)),
"r" (ioaddr(IOMD_IRQCLRA)));
}
static void rpc_mask_irq_a(unsigned int irq)
{
unsigned int temp;
__asm__ __volatile__(
"ldrb %0, [%2]\n"
" bic %0, %0, %1\n"
" strb %0, [%2]"
: "=&r" (temp)
: "r" (1 << (irq & 7)), "r" (ioaddr(IOMD_IRQMASKA)));
}
static void rpc_unmask_irq_a(unsigned int irq)
{
unsigned int temp;
__asm__ __volatile__(
"ldrb %0, [%2]\n"
" orr %0, %0, %1\n"
" strb %0, [%2]"
: "=&r" (temp)
: "r" (1 << (irq & 7)), "r" (ioaddr(IOMD_IRQMASKA)));
}
static void rpc_mask_irq_b(unsigned int irq)
{
unsigned int temp;
__asm__ __volatile__(
"ldrb %0, [%2]\n"
" bic %0, %0, %1\n"
" strb %0, [%2]"
: "=&r" (temp)
: "r" (1 << (irq & 7)), "r" (ioaddr(IOMD_IRQMASKB)));
}
static void rpc_unmask_irq_b(unsigned int irq)
{
unsigned int temp;
__asm__ __volatile__(
"ldrb %0, [%2]\n"
" orr %0, %0, %1\n"
" strb %0, [%2]"
: "=&r" (temp)
: "r" (1 << (irq & 7)), "r" (ioaddr(IOMD_IRQMASKB)));
}
static void rpc_mask_irq_dma(unsigned int irq)
{
unsigned int temp;
__asm__ __volatile__(
"ldrb %0, [%2]\n"
" bic %0, %0, %1\n"
" strb %0, [%2]"
: "=&r" (temp)
: "r" (1 << (irq & 7)), "r" (ioaddr(IOMD_DMAMASK)));
}
static void rpc_unmask_irq_dma(unsigned int irq)
{
unsigned int temp;
__asm__ __volatile__(
"ldrb %0, [%2]\n"
" orr %0, %0, %1\n"
" strb %0, [%2]"
: "=&r" (temp)
: "r" (1 << (irq & 7)), "r" (ioaddr(IOMD_DMAMASK)));
}
static void rpc_mask_irq_fiq(unsigned int irq)
{
unsigned int temp;
__asm__ __volatile__(
"ldrb %0, [%2]\n"
" bic %0, %0, %1\n"
" strb %0, [%2]"
: "=&r" (temp)
: "r" (1 << (irq & 7)), "r" (ioaddr(IOMD_FIQMASK)));
}
static void rpc_unmask_irq_fiq(unsigned int irq)
{
unsigned int temp;
__asm__ __volatile__(
"ldrb %0, [%2]\n"
" orr %0, %0, %1\n"
" strb %0, [%2]"
: "=&r" (temp)
: "r" (1 << (irq & 7)), "r" (ioaddr(IOMD_FIQMASK)));
}
static __inline__ void irq_init_irq(void)
{
extern void ecard_disableirq(unsigned int irq);
extern void ecard_enableirq(unsigned int irq);
int irq;
outb(0, IOMD_IRQMASKA);
outb(0, IOMD_IRQMASKB);
outb(0, IOMD_FIQMASK);
outb(0, IOMD_DMAMASK);
for (irq = 0; irq < NR_IRQS; irq++) {
switch (irq) {
case 0 ... 6:
irq_desc[irq].probe_ok = 1;
case 7:
irq_desc[irq].valid = 1;
irq_desc[irq].mask_ack = rpc_mask_irq_ack_a;
irq_desc[irq].mask = rpc_mask_irq_a;
irq_desc[irq].unmask = rpc_unmask_irq_a;
break;
case 9 ... 15:
irq_desc[irq].probe_ok = 1;
case 8:
irq_desc[irq].valid = 1;
irq_desc[irq].mask_ack = rpc_mask_irq_b;
irq_desc[irq].mask = rpc_mask_irq_b;
irq_desc[irq].unmask = rpc_unmask_irq_b;
break;
case 16 ... 22:
irq_desc[irq].valid = 1;
irq_desc[irq].mask_ack = rpc_mask_irq_dma;
irq_desc[irq].mask = rpc_mask_irq_dma;
irq_desc[irq].unmask = rpc_unmask_irq_dma;
break;
case 32 ... 40:
irq_desc[irq].valid = 1;
irq_desc[irq].mask_ack = ecard_disableirq;
irq_desc[irq].mask = ecard_disableirq;
irq_desc[irq].unmask = ecard_enableirq;
break;
case 64 ... 72:
irq_desc[irq].valid = 1;
irq_desc[irq].mask_ack = rpc_mask_irq_fiq;
irq_desc[irq].mask = rpc_mask_irq_fiq;
irq_desc[irq].unmask = rpc_unmask_irq_fiq;
break;
}
}
}